#include "JSonWriter.h"

#include <cstdlib>
#include <fstream>
#include <iostream>
#include <map>
#include <sstream>
#include <utility>
#include <string>
#include <list>
#include "../common/general/Constantes.h"
#include "File.h"

JSonWriter::JSonWriter() { }

JSonWriter::~JSonWriter() { }

std::string JSonWriter::saveJSonFile(GeneralConfiguration gc,
                                     BoardConfiguration bc, 
									 std::string archivo) {
    std::ofstream archivoNivel;
    Json::Value nivel;
	
	std::stringstream ss;
	std::string nombreArchivoNivel;
	
	// Si viene vacio es un nivel nuevo, sino edito el existente
	if (archivo.compare("") == 0) {
		ss << RUTA_NIVELES << obtenerNumeroNivel() << ".json";
		nombreArchivoNivel = ss.str();
	}else {
		nombreArchivoNivel = archivo;
	}
	
    archivoNivel.open(nombreArchivoNivel, std::ios::out);

    /* Datos generales */
    nivel["nombreNivel"] = gc.getNombreNivel();
    nivel["imagenFondo"] = gc.getImagenFondo();
    nivel["puntajeRequerido"] = gc.getPuntajeRequerido();
    nivel["maxJugadores"] = gc.getMaximoJugadores();
    nivel["cantFilas"] = gc.getCantidadFilas();
    nivel["cantColumnas"] = gc.getCantidadColumnas();
	nivel["sonidoMovimiento"] = gc.getSonidoMovimiento();
    nivel["sonidoCombinacion"] = gc.getSonidoCombinacion();
	
    /* Probabilidades */

    /* Por celda */
    nivel["probabilidades"]["celda"]["button"]["r"] = 
                                            gc.getCeldaRedButton();
    nivel["probabilidades"]["celda"]["button"]["y"] = 
                                            gc.getCeldaYellowButton();
    nivel["probabilidades"]["celda"]["button"]["g"] =   
                                            gc.getCeldaGreenButton();
    nivel["probabilidades"]["celda"]["button"]["b"] = 
                                            gc.getCeldaBlueButton();
    nivel["probabilidades"]["celda"]["button"]["v"] = 
                                            gc.getCeldaVioletButton();
    nivel["probabilidades"]["celda"]["miniBar"]["r"] = 
                                            gc.getCeldaRedMiniBar();
    nivel["probabilidades"]["celda"]["miniBar"]["y"] = 
                                            gc.getCeldaYellowMiniBar();
    nivel["probabilidades"]["celda"]["miniBar"]["g"] = 
                                            gc.getCeldaGreenMiniBar();
    nivel["probabilidades"]["celda"]["miniBar"]["b"] = 
                                            gc.getCeldaBlueMiniBar();
    nivel["probabilidades"]["celda"]["miniBar"]["v"] = 
                                            gc.getCeldaVioletMiniBar();

    nivel["probabilidades"]["celda"]["goldenStar"] = 
                                            gc.getCeldaGoldenStar();

    /* Por columna */
    nivel["probabilidades"]["columna"]["button"]["r"] = 
                                            gc.getColumnaRedButton();
    nivel["probabilidades"]["columna"]["button"]["y"] = 
                                            gc.getColumnaYellowButton();
    nivel["probabilidades"]["columna"]["button"]["g"] = 
                                            gc.getColumnaGreenButton();
    nivel["probabilidades"]["columna"]["button"]["b"] = 
                                            gc.getColumnaBlueButton();
    nivel["probabilidades"]["columna"]["button"]["v"] = 
                                            gc.getColumnaVioletButton();

    nivel["probabilidades"]["columna"]["miniBar"]["r"] = 
                                            gc.getColumnaRedMiniBar();
    nivel["probabilidades"]["columna"]["miniBar"]["y"] =
                                            gc.getColumnaYellowMiniBar();
    nivel["probabilidades"]["columna"]["miniBar"]["g"] =
                                            gc.getColumnaGreenMiniBar();
    nivel["probabilidades"]["columna"]["miniBar"]["b"] = 
                                            gc.getColumnaBlueMiniBar();
    nivel["probabilidades"]["columna"]["miniBar"]["v"] =
                                            gc.getColumnaVioletMiniBar();

    nivel["probabilidades"]["columna"]["goldenStar"] = 
                                            gc.getColumnaGoldenStar();

    /* Tablero */
    std::map<std::pair<int, int>, Candy * > imagenes = *(bc.getImagenes());
    std::map<std::pair<int, int>, Candy * >::iterator it;

    for (it = imagenes.begin(); it != imagenes.end(); it++) {
        std::pair<int, int> posicion = it->first;

        std::stringstream ss;

        std::string fila;
        std::string columna;

        // Copio la fila
        ss << posicion.first;
        ss >> fila;

        //Limpio el stringstream
        ss.clear();
        ss.str("");

        // Copio la columna
        ss << posicion.second;
        ss >> columna;

        nivel["tablero"][columna][fila] = it->second->getJsonName();
    }

    archivoNivel << nivel;
    archivoNivel.close();

    return nombreArchivoNivel;
}

int JSonWriter::obtenerNumeroNivel() {
    File file;
    int nroNivelMax = 0;

    std::list<std::string>* listaNiveles = 
                               file.listFiles(RUTA_NIVELES, ".json");
    for (std::list<std::string>::iterator it = listaNiveles->begin();
            it != listaNiveles->end(); it++) {
        std::string nombreNivel = *it;
        int nroNivel = 
                atoi(nombreNivel.substr(0, nombreNivel.find(".json")).c_str());

        if (nroNivel > nroNivelMax) {
            nroNivelMax = nroNivel;
        }
    }

    delete listaNiveles;
    return nroNivelMax + 1;
}
